package vue 
{
  import flash.display.Shape;
  import flash.display.Sprite;
  import flash.events.*;
  import flash.geom.Matrix3D;
  import flash.geom.Vector3D;


 // [SWF(width="500", heigh="500", frameRate="10")]

	//doit etendre de DecorateurObjet3D
  public class Cube3D extends DecorateurObjet3D {
     private var scene:Sprite;
     private var vecteurFaces:Vector.<Shape>;
     //boolean pour animation
     private var flg:Boolean=false;
	
	/**
     private var centreX:Number = stage.stageWidth/2;
     private var centreY:Number = stage.stageHeight/2;
	**/
	
   
     private var centreX:Number = 300;
     private var centreY:Number = 200;
	

     public function Cube3D(objet3d:Objet3D,scaleX:int,scaleY:int,scaleZ:int):void {
     	super(scaleX,scaleY,scaleZ);
       /**
       stage.addEventListener(Event.ENTER_FRAME, raffraichissement);
       **/

        // Création d'un second sprite pour initialiser les axes de rotation de l'objet 3D au centre de l'écran
        scene = new Sprite();
        scene.x = centreX;
      
        scene.y = centreY;
        addChild(scene);

        vecteurFaces = new Vector.<Shape>();
        positionne (0xff0000,   0,   0,    0, "",       0);
        positionne (0x00ff00,  50,   0,  -50, "AXE_Y", 90);
        positionne (0x0000ff, -50,   0,  -50, "AXE_Y", 90);
        positionne (0xffff00,   0,   0, -100, "",       0);
        positionne (0xff00ff,   0,  50,  -50, "AXE_X", 90);
        positionne (0x00ffff,   0, -50,  -50, "AXE_X", 90);
        
        //animation de chaque cube
        this.addEventListener(MouseEvent.CLICK, clickHandler);
        //this.addEventListener(Event.ENTER_FRAME, raffraichissement);
        
        
       //addChild(this.objet3d);
     }
     
     //animation du cube au click
	public function clickHandler(e:MouseEvent):void {
		flg=! flg;
		if (flg) {
			this.addEventListener( Event.ENTER_FRAME, raffraichissement);
		} else {
			this.removeEventListener(Event.ENTER_FRAME, raffraichissement);
		}
	}
     public function getVecteurFaces():Vector.<Shape> {
		return this.vecteurFaces;

     }

     private function positionne(couleur:int, x:int, y:int, z:int, axe:String, degres:int):void {
        var forme:Shape = new Shape();
        scene.addChild(forme);

        forme.graphics.beginFill(couleur);
        // Les décalages en négatifs sont nécessaires pour placer les axes de rotation au centre de la forme
        forme.graphics.drawRect(-50, -50, 100, 100);
        forme.graphics.endFill();

        var matrice:Matrix3D = new Matrix3D();
        switch (axe) {
           case "AXE_X" :
              matrice.appendRotation(degres, Vector3D.X_AXIS);
           break;
           case "AXE_Y" :
              matrice.appendRotation(degres, Vector3D.Y_AXIS);
           break;
           case "AXE_Z" :
              matrice.appendRotation(degres, Vector3D.Z_AXIS);
           break;
           default:;
       }

       matrice.appendTranslation(x, y, z);

       forme.transform.matrix3D = matrice;
	   matrice.appendScale(this.scalex,this.scaley,this.scalez);
       vecteurFaces.push(forme);
    }

    private function raffraichissement(e:Event):void {
       for each (var forme:Shape in vecteurFaces) {
           forme.transform.matrix3D.appendRotation(10, Vector3D.Y_AXIS);
       }
       zsort();
    }

    // tri des faces suivant l'axe Z (profondeur)
    // prise sur Internet...
    private function zsort():void {
       vecteurFaces.sort( critere_comparaison );
       var num:uint=vecteurFaces.length;
       var i:int=num;
       while ( i-- ) {
           scene.setChildIndex( vecteurFaces[i], num-1 );
       }
   }

   private function critere_comparaison( f1:Shape, f2:Shape ):Number {
       return f1.z - f2.z;
   }
 }
}


